//
// Created by leisurexi on 2020/9/26.
// 读取缓冲区示例，服务端没读取一段数据之后进行休眠，模拟真实业务处理所花费的时间
//
#include "lib/common.h"

void read_data(int sockfd) {
    char buf[1024];

    int time = 0;
    for (;;) {
        fprintf(stdout, "block in read\n");
        if ((readn(sockfd, buf, 1024)) == 0)
            return;
        time++;
        fprintf(stdout, "1K read for %d\n", time);
        usleep(1000);
    }
}

int main(int argc, char **argv) {
    int listenfd, connfd;
    socklen_t clilen;
    struct sockaddr_in cliaddr, servaddr;

    listenfd = socket(AF_INET, SOCK_STREAM, 0);

    // 将 servaddr 字节全部清0
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    // 将32位整数由主机字节顺序转换为网络字节顺序
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    // 将16位整数由主机字节顺序转换为网络字节顺序
    servaddr.sin_port = htons(12345);

    // bind 到本地地址，端口为12345
    bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
    // listen 的 backlog 为 1024
    listen(listenfd, 1024);

    // 循环处理用户请求
    for (;;) {
        clilen = sizeof(cliaddr);
        connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);
        // 读取数据
        read_data(connfd);
        // 关闭连接套接字，注意不是监听套接字
        close(connfd);
    }

}
